import pandas as pd
import os
from datetime import datetime

# 文件路径
file_path = r'e:\ProjectDemo\spider\PythonProject\logger\distinct\bee-big-screen-2025-08_duplicates.xlsx'
# 使用时间戳生成唯一的输出文件名，避免权限冲突
timestamp = datetime.now().strftime('%Y%m%d%H%M%S')
output_file = r'e:\ProjectDemo\spider\PythonProject\logger\distinct\bee-big-screen-2025-08_processed_{}.xlsx'.format(timestamp)

try:
    # 读取Excel文件中的所有sheet
    xl = pd.ExcelFile(file_path)
    sheet_names = xl.sheet_names
    
    print(f"发现{len(sheet_names)}个sheet: {', '.join(sheet_names)}")
    
    # 检查是否有至少4个sheet
    if len(sheet_names) < 4:
        print(f"错误: 发现{len(sheet_names)}个sheet，少于预期的4个")
        exit(1)
    
    # 获取第4个sheet的数据（索引为3）
    duplicates_sheet_name = sheet_names[3]
    print(f"使用第4个sheet: {duplicates_sheet_name}")
    duplicates_df = xl.parse(duplicates_sheet_name)
    
    # 检查第4个sheet中是否有'repeate'列
    if 'repeate' not in duplicates_df.columns:
        print(f"错误: 在sheet '{duplicates_sheet_name}'中未找到'repeate'列")
        exit(1)
    
    # 获取所有rtuAddress数据（不仅仅是重复>=20的）
    all_rtu_addresses = duplicates_df['rtuAddress'].unique()
    print(f"总共发现{len(all_rtu_addresses)}个不同的rtuAddress值")
    
    # 筛选出repeate >= 20的数据
    filtered_df = duplicates_df[duplicates_df['repeate'] >= 20]
    print(f"筛选出{len(filtered_df)}条重复次数>=20的数据")
    
    # 尝试的时间列名称列表
    time_column_candidates = ['time', '日期', 'timestamp', '时间', 'datetime', 'date']
    
    # 从前3个sheet中获取时间信息（按时间顺序）
    time_info = {}
    all_time_data = []
    
    for sheet_name in sheet_names[:3]:
        df = xl.parse(sheet_name)
        
        # 尝试查找时间列
        time_col = None
        for candidate in time_column_candidates:
            if candidate in df.columns:
                time_col = candidate
                print(f"在sheet '{sheet_name}'中找到时间列: {time_col}")
                break
        
        if not time_col:
            # 尝试模糊匹配
            time_columns = [col for col in df.columns if any(keyword in col.lower() for keyword in ['time', '日期', 'timestamp', '时间'])]
            
            if time_columns:
                time_col = time_columns[0]
                print(f"在sheet '{sheet_name}'中模糊匹配到时间列: {time_col}")
            else:
                print(f"警告: 在sheet '{sheet_name}'中未找到时间列")
                continue
        
        # 提取rtuAddress和对应的时间
        if 'rtuAddress' in df.columns:
            for _, row in df.iterrows():
                rtu = str(row['rtuAddress'])
                time = row[time_col]
                all_time_data.append({'rtu': rtu, 'time': time, 'sheet': sheet_name})
    
    # 按时间排序所有数据
    try:
        all_time_data.sort(key=lambda x: pd.to_datetime(x['time']))
    except:
        print("警告: 无法解析时间格式，将按原始顺序排序")
    
    # 为每个rtuAddress选择最早出现的时间
    for item in all_time_data:
        rtu = item['rtu']
        time = item['time']
        if rtu not in time_info:
            time_info[rtu] = time
    
    # 为每个rtuAddress创建时间序列和计数
    rtu_time_series = {}

    # 从前三个sheet收集所有rtuAddress的时间信息
    for sheet_name in sheet_names[:3]:
        df = xl.parse(sheet_name)

        # 尝试查找时间列
        time_col = None
        for candidate in time_column_candidates:
            if candidate in df.columns:
                time_col = candidate
                break

        if not time_col:
            # 尝试模糊匹配
            time_columns = [col for col in df.columns if any(keyword in col.lower() for keyword in ['time', '日期', 'timestamp', '时间'])]
            if time_columns:
                time_col = time_columns[0]
            else:
                continue

        # 提取rtuAddress和对应的时间
        if 'rtuAddress' in df.columns and time_col:
            for _, row in df.iterrows():
                rtu = str(row['rtuAddress'])
                time = row[time_col]
                if rtu not in rtu_time_series:
                    rtu_time_series[rtu] = []
                rtu_time_series[rtu].append({'time': time, 'sheet': sheet_name})

    # 对每个rtuAddress的时间序列进行排序
    for rtu in rtu_time_series:
        try:
            rtu_time_series[rtu].sort(key=lambda x: pd.to_datetime(x['time']))
        except:
            # 如果无法解析时间，按原始顺序排序
            pass

    # 创建新的结果DataFrame
    result_data = []

    # 处理第4个sheet中repeate >= 20的数据
    for _, row in filtered_df.iterrows():
        rtu = str(row['rtuAddress'])
        max_repeate = row['repeate']

        # 检查该rtuAddress是否在前三个sheet中有记录
        if rtu in rtu_time_series and len(rtu_time_series[rtu]) >= max_repeate:
            # 获取对应次数的时间记录
            time_record = rtu_time_series[rtu][max_repeate - 1]  # 从0开始计数
            time = time_record['time']
            # 从0开始的计数
            repeate_count = max_repeate - 1
        else:
            time = '未知'
            repeate_count = max_repeate - 1  # 即使没有足够的记录，也从0开始计数

            result_data.append({'时间': time, 'rtuAddress': rtu, 'repeate_count': repeate_count})
    
    # 创建DataFrame并按时间排序
    result_df = pd.DataFrame(result_data)

    # 尝试按时间排序
    try:
        result_df['时间'] = pd.to_datetime(result_df['时间'], errors='coerce')
        result_df = result_df.sort_values('时间')
        # 恢复原始时间格式
        result_df['时间'] = result_df['时间'].dt.strftime('%Y-%m-%d %H:%M:%S.%f')
    except:
        print("警告: 无法按时间排序，将保持原始顺序")

    # 添加从1开始的编号列
    result_df.insert(0, '序号', range(1, len(result_df) + 1))
    
    # 创建ExcelWriter对象
    try:
        # 尝试使用xlsxwriter引擎
        writer = pd.ExcelWriter(output_file, engine='xlsxwriter')
    except ModuleNotFoundError:
        # 如果xlsxwriter不存在，使用默认引擎
        print("警告: xlsxwriter模块未安装，将使用默认引擎")
        writer = pd.ExcelWriter(output_file)
    
    # 写入原始sheet数据
    for sheet_name in sheet_names:
        xl.parse(sheet_name).to_excel(writer, sheet_name=sheet_name, index=False)
    
    # 写入筛选结果sheet
    result_df.to_excel(writer, sheet_name='筛选结果(重复>=20)', index=False)
    
    writer.close()
    
    print(f"处理完成! 结果已保存到: {output_file}")
    
except FileNotFoundError:
    print(f"错误: 找不到文件 '{file_path}'")
except Exception as e:
    print(f"处理过程中发生错误: {str(e)}")